package com.zenagro.utils;

import java.io.*;
import java.util.*;

import javax.ejb.*;
import javax.inject.*;
import javax.naming.*;

import org.apache.commons.fileupload.*;
import org.openxava.model.*;
import org.openxava.util.*;
import org.openxava.view.*;

import com.zenagro.domain.zenagro.base.*;

public class FileEntityUtils {

	
	HashMap mapaComun;
	
	View view;
	
	FileItem fi;
	String folder;
	
	public static String pathRepo=null;
	
	static{
		// Get the base naming context
		Context env;
		try {
			env = (Context)new InitialContext().lookup("java:comp/env");
			// Get a single value
			pathRepo = (String)env.lookup("pathRepo");
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


	}
	
	public FileEntityUtils(){}
	
	public FileEntityUtils(View view,	HashMap mapaComun){
		this.view=view;
		this.mapaComun=mapaComun;
	}
	
	public void updateFile() throws ObjectNotFoundException, SystemException, XavaException, FinderException{
		String nombreModelo=getSimpleModelName(view);
		if(!view.isKeyEditable()){//Update 
			/*
			 * 1o: Comprobar que se trata de entidad con fichero asociado
			 *  2: Hay que eliminar el fichero anterior en caso de que se traiga uno nuevo
			 */
			    String filename=getFileName(view.getKeyValues());
				
				if(!Is.emptyString(filename)){//Si hay fichero
					deleteFolder(filename);
					
				}
			
		}
		fi=(FileItem) mapaComun.get(nombreModelo);
		folder=(String) mapaComun.get(nombreModelo+".folder");
	}
	
	public void saveFile() throws Exception{
		if(fi!=null){
			File folderModel=new File(pathRepo+File.separator+getSimpleModelName(view));
	        if (!folderModel.exists()) {
					folderModel.mkdir();
			}
	        File folderUnique=new File(folderModel.getAbsolutePath()+File.separator+folder);
	        folderUnique.mkdir();
	        String filename=(String) mapaComun.get(getSimpleModelName(view)+".filename");
	        File uploaded=new File(folderUnique.getAbsolutePath()+File.separator+filename);
	        fi.write(uploaded);
	        //Reseteo variables de sesion
	        mapaComun.put(getSimpleModelName(view),null);
	        mapaComun.put(getSimpleModelName(view)+".folder",null);
	        mapaComun.put(getSimpleModelName(view)+".filename",null);
		}
	}
	/**
	 * 
	 * @return el nombre de la carpeta + el nombre del fichero o null si la entidad no es FileIdentificable
	 * @throws FinderException 
	 * @throws XavaException 
	 * @throws SystemException 
	 * @throws ObjectNotFoundException 
	 */
	public String getFileName() throws ObjectNotFoundException, SystemException, XavaException, FinderException{
		 return getFileName(view.getKeyValues());
		
	}
	/**
	 * 
	 * @param key key de la entidad de la que se obtentrad el nombre del fichero
	 * @return el nombre de la carpeta + el nombre del fichero o null si la entidad no es FileIdentificable
	 * @throws ObjectNotFoundException
	 * @throws SystemException
	 * @throws FinderException
	 */
	public String getFileName(Map key) throws ObjectNotFoundException, SystemException, FinderException{
		String result=null;
		Object entityObj= MapFacade.findEntity(getSimpleModelName(view), key);
		if(entityObj instanceof FileIdentificable){
			FileIdentificable entity=(FileIdentificable)entityObj;
			 if(!Is.emptyString(entity.getFile())){
				 result=entity.getFile();
			 }
		}
			 
		return result;
	}
	
	
	
	public  void deleteFile(Map key) throws ObjectNotFoundException, SystemException, FinderException{
		Object entityObj= MapFacade.findEntity(getSimpleModelName(view), key);
		if(entityObj instanceof FileIdentificable){
			FileIdentificable entity=(FileIdentificable)entityObj;
			 if(!Is.emptyString(entity.getFile())){//Si hay fichero
				 String folder=entity.getFile().substring(0,entity.getFile().lastIndexOf(File.separator));
				 Files.deleteDir(pathRepo+File.separator+view.getModelName()+File.separator+folder);
			 }
		}
	}
	
	public void deleteFolder(String filename){
		 String folder=filename.substring(0,filename.lastIndexOf(File.separator));
		 Files.deleteDir(pathRepo+File.separator+view.getModelName()+File.separator+folder);
	}
	
	public static String getSimpleModelName(View view){
		if(view.getModelName().contains("."))
			return view.getModelName().substring(view.getModelName().lastIndexOf(".")+1,view.getModelName().length());
		return view.getModelName();
		
	}
	
}
